// Tag: Search, State Zip
#include <cctype>
#include <cstdio>
#include <cstring>

template <typename T>
inline T &read(T &x) {
  x = 0;
  bool f = false;
  short ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = true;
    ch = getchar();
  }
  while (isdigit(ch)) x = x * 10 + (ch ^ '0'), ch = getchar();
  if (f) x = -x;
  return x;
}

const int N = 23;
int ans, a[N], tmp[N], sum, n, m, expd[N], lim;

inline void update() { ans = sum, memcpy(a, tmp, sizeof(a)); }

void dfs(int x, int expd[N]) {
  if (sum > ans) return;
  bool flag = true;
  for (int i = 0; i < n; i++)
    if (expd[i] != lim) {
      flag = false;
      break;
    }
  if (flag) return update();
  if (x == n) return;
  int newexpd[N];
  memcpy(newexpd, expd, sizeof(newexpd));
  dfs(x + 1, newexpd);

  for (int j = 0; j < n; j++)
    if ((newexpd[j] >> x) & 1) newexpd[j] |= expd[x];
  tmp[++sum] = x;
  dfs(x + 1, newexpd);
  --sum;
}

int main() {
#ifndef ONLINE_JUDGE
#ifdef LOCAL
  freopen64("/tmp/CodeTmp/testdata.in", "r", stdin);
  freopen64("/tmp/CodeTmp/testdata.out", "w", stdout);
#else
  freopen("party.in", "r", stdin);
  freopen("party.out", "w", stdout);
#endif
#endif

  read(n), read(m);
  for (int i = 0; i < n; i++) expd[i] |= 1 << i;
  for (int i = 1, l, r; i <= m; i++) {
    --read(l), --read(r);
    expd[l] |= 1 << r;
    expd[r] |= 1 << l;
  }
  ans = n, lim = (1 << n) - 1;
  dfs(0, expd);
  printf("%d\n", ans);
  for (int i = 1; i <= ans; ++i) printf("%d ", a[i] + 1);
  return 0;
}